REST API 구현
✒️ 2025-06-25 13:13 내용 수정
@RestController
- REST API를 구현할 때 사용하는 Controller다.
- REST : 네트워크에서 HTTP로 데이터를 주고 받는 방법을 말하며, 이를 구현한 API가 REST API다.
@RestController
public class UserController {
// 데이터를 반환하는 endpoint
@GetMapping("/api/data")
public String getData() {
return "반환용 데이터";
}
}
@RequestBody
- REST API에서 클라이언트로부터 JSON 데이터를 받을 때 사용한다.
- 클라이언트에서 서버로 데이터를 전달할 때 요청에 포함된 Body의 JSON 데이터를 Java 객체로 변환한다.
- 변환은 Spring Boot에선 Jackson 라이브러리가 담당한다.
// 클라이언트에서 요청 전송
fetch('/api/user/', {
method: 'POST',
headers: {
'Content-Type': 'application/json' // json body 명시
},
body: JSON.stringify({
name: '홍길동', email: 'hong@aaa.ccc'
})
});
POST /api/user HTTP/1.1
Content-Type: application/json
{
"name" : "홍길동",
"email" : "hong@aaa.ccc"
}
- JSON 데이터를 예제의
User객체에 자동으로 Mapping한다.
@RestController
public class UserController {
@PostMapping("/api/user")
public ResponseEntity<String> addUser(@RequestBody User user) {
// 사용자 추가 동작
return ResponseEntity.ok("사용자 추가 완료");
}
}
User클래스는 Model에 속하는 DTO로 JavaBean, DTO의 구조로 작성해야 한다.- Jackson 라이브러리에서 자동 변환 시에도 기본 생성자, getter와 setter를 확인하여 변환을 진행한다.
public class User {
private String name;
private String email;
public User() {}
public User(String name, String email) {
this.name = name;
this.email = email;
}
public void setName(String name) {this.name = name;}
public String getName() {return this.name;}
public void setEmail(String email) {this.email = email;}
public String getEmail() {return this.email;}
}
@ResponseBody
- 서버에서 클라이언트로 데이터를 전달할 때 Java 객체를 JSON으로 변환하여 응답의 Body에 추가한다.
- Body에 기본 타입(String, int 등), 객체, 컬렉션, Map 등의 타입을 추가할 수 있다.
@RestController=@Controller+@ResponseBody- 즉
@RestController를 지정한 Controller에선 모든 메서드에 자동으로@ResponseBody가 추가된다.
- 즉
@Controller
public class UserController {
@GetMapping("/user/{id}")
@ReponseBody
public ResponseEntity<User> getUser(@PathVariable int id) {
// 사용자 검색 동작
UserDAO dao = UserDAO.getInstance();
User user = dao.getUser(id);
return ResponseEntity.ok(user); // Body에 user 첨부
}
}
// 위와 동일한 동작
@RestController
public class UserController {
@GetMapping("/user/{id}")
public ResponseEntity<User> getUser(@PathVariable int id) {
// 사용자 검색 동작
UserDAO dao = UserDAO.getInstance();
User user = dao.getUser(id);
return ResponseEntity.ok(user); // Body에 user 첨부
}
}
HTTP/1.1 200 OK
Content-Type: application/json
{
"name" : "홍길동",
"email" : "hong@aaa.ccc"
}
@Controller과 @RestController의 차이
@Controller 방식
- JSP나 HTML 파일처럼 View를 반환해야 하는 경우에 사용한다.
@Controller
public class UserController {
// page를 반환하는 endpoint
@GetMapping("/form")
public String getPage() {
return "form"; // form.html 반환
}
}
- 요청의 데이터를 받을 때
@RequestParam를 사용하거나@ModelAttribute를 사용한다.- 데이터가 너무 많을 땐
@RequestParam보다@ModelAttribute가 Parameter 관리에 유용하다.
- 데이터가 너무 많을 땐
@Controller
public class ProductController {
@PostMapping("/product")
public String addProduct(
@RequestParam String name,
@RequestParam String category,
@RequestParam String origin
) {
// Product의 데이터를 query string으로 받음
// 파라미터가 너무 많으면 관리가 어려움
return "product";
}
}
@Controller
public class ProductController {
@PostMapping("/product")
public String addProduct (
@ModelAttribute Product product
) {
// form 데이터 수신 -> Product에 Mapping
// 관리가 훨씬 수월함
return "product";
}
}
@RestController 방식
- 데이터를 직접 반환할 때 사용한다.
- endpoint 호출 시 메서드의 반환 값을 HTTP 응답의 본문에 담아 전송한다.
@RestController
public class UserController {
// 데이터를 반환하는 endpoint
@GetMapping("/api/data")
public String getData() {
return "반환용 데이터"; // 문자열 그대로 반환
}
}
- 요청의 JSON 데이터를 받을 때
@RequestBody로 받는다.
@RestController
public class ProductController {
@PostMapping("/product")
public ResponseEntity<String> addProduct(
@RequestBody Product product
) {
return ResponseEntity.ok("상품 추가 완료");
}
}
@Controller + @RestController
- 하나의 Controller에 기존
@Controller와@RestController를 혼합하여 사용할 수 있다.- 페이지 반환 용
@Controller는 기존 방법대로 작성한다. - REST API endpoint로 사용할 메서드에는
@ResponseBodyAnnotation을 추가한다.
- 페이지 반환 용
@Controller
public class UserController {
// view page를 반환하는 endpoint
@GetMapping("/form")
public String getPage() {
return "form";
}
// rest api
@GetMapping("/api/data")
@ResponseBody // 중요!
public String getData() {
return "반환용 데이터";
}
}